#ifndef __PC_SIMD_H
#define __PC_SIMD_H

#include "wtype.h"

bool simd_match8(Reg32 *dst, Reg128 *opt1, Reg128 *opt2);
bool simd_unpack8(Reg128 *dst, Reg64 *opt1, Reg64 *opt2);
bool simd_unpack16(Reg128 *dst, Reg64 *opt1, Reg64 *opt2);
bool simd_add8_ext1(Reg128 *dst, Reg32 *opt1, Reg128 *opt2);
bool simd_sub8_ext1(Reg128 *dst, Reg32 *opt1, Reg128 *opt2);
bool simd_add8_ext2(Reg128 *dst, Reg128 *opt1, Reg32 *opt2);
bool simd_sub8_ext2(Reg128 *dst, Reg128 *opt1, Reg32 *opt2);
bool simd_add16_ext1(Reg128 *dst, Reg32 *opt1, Reg128 *opt2);
bool simd_sub16_ext1(Reg128 *dst, Reg32 *opt1, Reg128 *opt2);
bool simd_add16_ext2(Reg128 *dst, Reg128 *opt1, Reg32 *opt2);
bool simd_sub16_ext2(Reg128 *dst, Reg128 *opt1, Reg32 *opt2);
bool simd_mask8(Reg32 *dst, Reg128 *opt1);
bool simd_mask16(Reg32 *dst, Reg128 *opt1);
bool simd_match16(Reg32 *dst, Reg128 *opt1, Reg128 *opt2);
bool simd_shuffle8(Reg128 *dst, Reg128 *opt1, Reg64 *opt2);
bool simd_8to16(Reg128 *dst, Reg64 *opt1);
bool simd_8to32(Reg128 *dst, Reg32 *opt1);
bool simd_16to32(Reg128 *dst, Reg64 *opt1);
bool simd_sub16(Reg128 *dst, Reg128 *opt1, Reg128 *opt2);
bool simd_shift32(Reg128 *dst, Reg128 *opt1, Reg32 *opt2);
bool simd_shift16(Reg128 *dst, Reg128 *opt1, Reg32 *opt2);
bool simd_add8(Reg128 *dst, Reg128 *opt1, Reg128 *opt2);
bool simd_add8_16(Reg128 *dst, Reg64 *opt1, Reg64 *opt2);
bool simd_max32(Reg128 *dst, Reg128 *opt1, Reg128 *opt2);
bool simd_min32(Reg128 *dst, Reg128 *opt1, Reg128 *opt2);
bool simd_max32_mak(Reg128 *dst, Reg128 *opt1, Reg128 *opt2);
bool simd_min32_mak(Reg128 *dst, Reg128 *opt1, Reg128 *opt2);
bool simd_min16_mak(Reg128 *dst, Reg128 *opt1, Reg128 *opt2);
bool simd_max8_mak(Reg128 *dst, Reg128 *opt1, Reg128 *opt2);
bool simd_min8_mak(Reg128 *dst, Reg128 *opt1, Reg128 *opt2);
bool simd_enlarg8(Reg128 *dst, Reg64 *opt1);
bool simd_enlarg16(Reg128 *dst, Reg64 *opt1);
bool simd_enlarg32(Reg128 *dst, Reg64 *opt1);
bool simd_ext8(Reg128 *dst, Reg32 *opt1, Reg32 *opt2);
bool simd_ext16(Reg128 *dst, Reg32 *opt1, Reg32 *opt2);
bool simd_ext32(Reg128 *dst, Reg32 *opt1);
bool simd_set(Reg128 *dst, Reg32 *opt1);
bool simd_mul(Reg128 *dst, Reg128 *opt1, Reg128 *opt2);
bool simd_fadd(Reg128 *dst, Reg128 *opt1, Reg128 *opt2);
bool simd_fsub(Reg128 *dst, Reg128 *opt1, Reg128 *opt2);
bool simd_fsum(Reg32 *dst, Reg128 *opt1);
bool simd_fmax1(Reg32 *dst, Reg128 *opt1);
bool simd_fmin1(Reg32 *dst, Reg128 *opt1);
bool simd_fmax4(Reg128 *dst, Reg128 *opt1, Reg128 *opt2);
bool simd_fmin4(Reg128 *dst, Reg128 *opt1, Reg128 *opt2);
bool simd_fabs(Reg128 *dst, Reg128 *opt1);
bool simd_fmac_4(Reg32 *dst, Reg128 *opt1, Reg128 *opt2);
bool simd_fmul(Reg128 *dst, Reg128 *opt1, Reg128 *opt2);
bool simd_match(Reg32 *dst, Reg128 *opt1, Reg128 *opt2);
bool simd_i8f32(Reg128 *dst, Reg32 *opt1, Reg32 *opt2);
bool simd_i32f32(Reg128 *dst, Reg128 *opt1, Reg32 *opt2);
bool simd_f32i32(Reg128 *dst, Reg128 *opt1, Reg32 *opt2);
bool simd_f32i64(Reg128 *dst, Reg64 *opt1, Reg32 *opt2);
bool simd_mac16_8(Reg32 *dst, Reg128 *opt1, Reg128 *opt2);
bool simd_muls32(Reg128 *dst, Reg128 *opt1, Reg128 *opt2);
bool simd_mac32_4(Reg32 *dst, Reg128 *opt1, Reg128 *opt2);
bool simd_16to8(Reg64 *dst, Reg128 *opt1, Reg32 *opt2);
bool simd_32to16(Reg64 *dst, Reg128 *opt1, Reg32 *opt2);
bool simd_fshift(Reg128 *dst, Reg128 *opt1, Reg32 *opt2);
bool simd_frelu(Reg128 *dst, Reg128* opt1);
bool simd_fleaky(Reg128 *dst, Reg128* opt1);
bool simd_min_disp(Reg128 *dst, Reg32* opt1);
bool simd_interp(Reg32 *dst, Reg128 *opt1, Reg128 *opt2);
bool simd_linear(Reg64 *dst, Reg128 *opt1, Reg32 *opt2);
bool simd_relu(Reg64 *dst, Reg128 *opt1, Reg32 *opt2);
bool simd_leaky(Reg64 *dst, Reg128 *opt1, Reg32 *opt2);
bool simd_sample(Reg128 *dst, Reg128 *opt1, Reg32 *opt2);
bool simd_sl(Reg128 *dst, Reg128 *opt1, Reg32 *opt2);
bool simd_xor(Reg128 *dst, Reg128 *opt1, Reg128 *opt2);
bool simd_and(Reg128 *dst, Reg128 *opt1, Reg128 *opt2);
bool simd_or(Reg128 *dst, Reg128 *opt1, Reg128 *opt2);
bool simd_2bit_to_1bit(Reg128 *dst, Reg128 *opt1, Reg128 *opt2);
bool simd_1bit_to_2bit(Reg128 *dst, Reg64 *opt1);
bool simd_muls16(Reg128 *dst, Reg64 *opt1, Reg64 *opt2);
bool simd_mac16_4(Reg32 *dst, Reg64 *opt1, Reg64 *opt2);
bool simd_add32(Reg128 *dst, Reg128 *opt1, Reg128 *opt2);
bool simd_sub32(Reg128 *dst, Reg128 *opt1, Reg128 *opt2);
bool simd_add16(Reg128 *dst, Reg128 *opt1, Reg128 *opt2);
bool simd_sub8(Reg128 *dst, Reg128 *opt1, Reg128 *opt2);
bool simd_max16(Reg128 *dst, Reg128 *opt1, Reg128 *opt2);
bool simd_min16(Reg128 *dst, Reg128 *opt1, Reg128 *opt2);
bool simd_max16_mak(Reg128 *dst, Reg128 *opt1, Reg128 *opt2);
bool simd_max8(Reg128 *dst, Reg128 *opt1, Reg128 *opt2);
bool simd_min8(Reg128 *dst, Reg128 *opt1, Reg128 *opt2);
bool simd_shuffle64(Reg64 *dst, Reg64 *opt1);
bool simd_shuffle128(Reg128 *dst, Reg128 *opt1);
bool simd_max16_8(Reg32 *dst, Reg128 *opt1);
bool simd_min16_8(Reg32 *dst, Reg128 *opt1);

#endif // ! __PC_SIMD_H
